package websocket.service;

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import websocket.entity.HangXiangDO;
import websocket.entity.vo.ShuangZhouZhuanTaiVO;
import websocket.enum_.MsgType;
import websocket.enum_.PosTypeEnum;
import websocket.socket_.SocketMsg;
import websocket.socket_.WebSocketServer;
import websocket.util.DateUtil;
import websocket.util.DigitalTrans;

import java.io.IOException;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author nieruijie
 * @date 2022/5/22 14:17
 */
@Service
public class ChuanKouService {
    private static final Logger log = LoggerFactory.getLogger(ChuanKouService.class);

    /**
     * 公共方法，根据串口数据指针头标识作为一组数据转换成List数组
     * 如下所示以：AA 44 12为一组数据
     * AA 44 12 1C 2A 00 00 01 48 00 00 00 18 A0 A9 08 FC 51 36 17 81 DE 59 00 36 00 12 00 00 00 00 00 10 00 00 00 08 0F B0 07 E9 09 37 40 17 2A D2 E8 55 57 5C 40 00 00 00 47 5E 68 15 40 C1 00 CE C0 3D 00 00 00 19 F9 8E 3F B7 D0 6F 3F 19 8D 37 40 00 00 00 00 00 00 00 00 00 00 00 00 33 1C 1C 19 00 06 03 D3 C9 AE B0 6C
     *
     * @param needData 串口数据
     * @param zhenTou  帧头
     * @return
     */
    private static List<String> chuanKouChuLiInit(String needData, String zhenTou) {
        needData = needData.replaceAll(zhenTou, "NJ");
        String reg16 = "NJ[^NJ]*";
        //利用正则表达式定义规则，NJ开头中间除了NJ任意都获取，NJ结尾
        Pattern p = Pattern.compile(reg16);
        Matcher m = p.matcher(needData);
        List<String> contentList = new ArrayList<>();
        while (m.find()) {
            String content = m.group().substring(0, m.group().length() - 3);
            contentList.add(content.replace("NJ", zhenTou));
        }
        return contentList;
    }

    /**
     * 处理航向信息、最佳位置信息串口数据，并且发送socket消息
     *
     * @param needData 字节数组转16进制字符串
     * @param zhenTou  帧头
     */
    public static void chuLiChuanKouHangXiangData(String needData, String zhenTou) {
        if (StringUtils.isEmpty(needData)) {
            System.err.println("接收到串口数据为空！时间：" + DateUtil.formatNow());
            return;
        }
        // 获取处理完的串口数据
        List<String> contentList = chuanKouChuLiInit(needData, zhenTou);
        contentList.forEach(item -> {
            chuLiArr(item);
        });
    }

    /**
     * 处理航向信息、最佳位置信息串口数据-详情
     *
     * @param item
     */
    public static void chuLiArr(String item) {
//        item ="AA 44 12 1C 2A 00 00 01 48 00 00 00 18 A0 A9 08 FC 51 36 17 81 DE 59 00 36 00 12 00 00 00 00 00 10 00 00 00 08 0F B0 07 E9 09 37 40 17 2A D2 E8 55 57 5C 40 00 00 00 47 5E 68 15 40 C1 00 CE C0 3D 00 00 00 19 F9 8E 3F B7 D0 6F 3F 19 8D 37 40 00 00 00 00 00 00 00 00 00 00 00 00 33 1C 1C 19 00 06 03 D3 C9 AE B0 6C";
        HangXiangDO resultData = new HangXiangDO();
        // 下标
        int index = 0;
        // 将当前十六进制数据用空格分隔成数组
        String[] sixteenArr = item.split(" ");
        // 获取当前数组长度：作为后期数据转换使用
        int arrLength = sixteenArr.length;
        // 判断数组长度：小于75无法解析
        if (arrLength < 75) {
            return;
        }
        // 从第四位开始：头长度 0x1C   HeaderLength 字节数 = 1
        String fourItem = sixteenArr[3];
        // 从第五位开始：MessageID Log 的信息 ID 字节数 = 2 （字节数等于2，所以截取第五六位,这里低字节在前高字节在后，所以反着拼接）
        String sixToFiveItem = sixteenArr[5] + sixteenArr[4];
        // 从第七位开始：Message Type：00 =二进制,01 = ASCII,10 = 简化 ASCII (本次使用00也就是二进制)
        String sevenItem = sixteenArr[6];
        // 判断是否为二进制
        if (!sevenItem.equals("00")) {
            return;
        }
        // 从第八位开始：Reserved 保留 （保留字段，不管）
        String eightItem = sixteenArr[7];
        // 从第九位开始：Reserved 保留 （保留字段，不管）
        String nineItem = sixteenArr[8];

        int fourItemToInt = Integer.parseInt(DigitalTrans.covert16Zhuan10(fourItem));
        index += fourItemToInt;

        // 类型判断：messageID；那个数据
        // sixToFiveItem
        // 解析：是否等于航向    MessageID ：971
        Integer sixToFiveItemToInt = Integer.parseInt(DigitalTrans.covert16Zhuan10(sixToFiveItem));
//        System.err.println("MessageID:"+sixToFiveItemToInt);
        if (sixToFiveItemToInt == 971) {
            /*
            0 SOL_COMPUTED 已解出
            1 INSUFFICIENT_OBS 观测数据不足
            2 NO_CONVERGENCE 无法收敛
            4 COV_TRACE 协方差矩阵的迹超过最大值（迹>1000 米）*/
            // 解状态 (字节数 = 4，从头长度之后开始取值，四个字节)
            index += 4;
            String solStat = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4];
            int solStatInt = Integer.parseInt(DigitalTrans.covert16Zhuan10(solStat));
            // 位置类型 （字节数 = 4）
            index += 4;
            String posType = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4];
            int posTypeInt = Integer.parseInt(DigitalTrans.covert16Zhuan10(posType));

            resultData.setPosType(PosTypeEnum.getMsgByIndex(posTypeInt));
            // 基线长（0-3000m）
            index += 4;
            String length = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4];
            double lengthDouble = Float.intBitsToFloat((int) Long.parseLong(length, 16));
            BigDecimal bigLength=new BigDecimal(lengthDouble);
            lengthDouble=bigLength.setScale(3,BigDecimal.ROUND_HALF_UP).doubleValue();
            resultData.setLength(lengthDouble);
            // 航向（0到360.0 deg）
            index += 4;
            String heading = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4];
            double headingDouble = Float.intBitsToFloat((int) Long.parseLong(heading, 16));
            BigDecimal bigHeading=new BigDecimal(headingDouble);
            headingDouble=bigHeading.setScale(6,BigDecimal.ROUND_HALF_UP).doubleValue();
            resultData.setHeading(headingDouble);
            // 仰俯（±90 deg）
            index += 4;
            String pitch = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4];
            double pitchLong = Float.intBitsToFloat((int) Long.parseLong(pitch, 16));
            BigDecimal bigPitch=new BigDecimal(pitchLong);
            pitchLong=bigPitch.setScale(6,BigDecimal.ROUND_HALF_UP).doubleValue();
            resultData.setPitch(pitchLong);
            // 使用的卫星数
            index += 18;
            String solnSVs = sixteenArr[index];
            Long solnSVsInt = Long.valueOf(DigitalTrans.covert16Zhuan10(solnSVs));
//            System.err.println("使用的卫星数：" + solnSVs);
//            System.err.println("使用的卫星数val：" + solnSVsInt);
            resultData.setSolnSVs(solnSVsInt);
//            System.err.println("<----------------------------------->");
            try {
                SocketMsg socketMsg = new SocketMsg(JSONObject.toJSONString(resultData), MsgType.HANG_XIANG);
                WebSocketServer.sendInfo(socketMsg, "nrj");
               // log.info("消息发送成功,【航向信息】时间:" + DateUtil.formatNow());
            } catch (IOException e) {
                log.error("消息发送失败,【航向信息】时间:" + DateUtil.formatNow());
                e.printStackTrace();
            }
        }
        // 解析：是否等于最佳位置  MessageID ：42
        if (sixToFiveItemToInt == 42) {
            // 维度（字节数 = 8）
            index += 16;
            String lat = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4] + sixteenArr[index - 5] + sixteenArr[index - 6] + sixteenArr[index - 7] + sixteenArr[index - 8];
            Long llat = Long.valueOf(lat, 16).longValue();
            double latDouble = Double.longBitsToDouble(llat);
            BigDecimal bigLat=new BigDecimal(latDouble);
            latDouble=bigLat.setScale(7,BigDecimal.ROUND_HALF_UP).doubleValue();
            resultData.setLat(latDouble);
            // 经度 （字节数 = 8）
            index += 8;
            String lon = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4] + sixteenArr[index - 5] + sixteenArr[index - 6] + sixteenArr[index - 7] + sixteenArr[index - 8];
            Long llon = Long.valueOf(lon, 16).longValue();
            double lonDouble = Double.longBitsToDouble(llon);
            BigDecimal bigLon=new BigDecimal(lonDouble);
            lonDouble=bigLon.setScale(7,BigDecimal.ROUND_HALF_UP).doubleValue();
            resultData.setLon(lonDouble);
            // 海拔高 （字节数 = 8）
            index += 8;
            String hgt = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4] + sixteenArr[index - 5] + sixteenArr[index - 6] + sixteenArr[index - 7] + sixteenArr[index - 8];
            Long lhgt = Long.valueOf(hgt, 16).longValue();
            double hgtDouble = Double.longBitsToDouble(lhgt);
            BigDecimal bigHgt=new BigDecimal(hgtDouble);
            hgtDouble=bigHgt.setScale(3,BigDecimal.ROUND_HALF_UP).doubleValue();
            resultData.setHgt(hgtDouble);
            index += 28;
            // 差分龄期 （字节数 = 4）
            String diff_age = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4];
            double diff_ageDouble = Float.intBitsToFloat((int) Long.parseLong(diff_age, 16));
            BigDecimal bigDiff=new BigDecimal(diff_ageDouble);
            diff_ageDouble=bigDiff.setScale(3,BigDecimal.ROUND_HALF_UP).doubleValue();
            resultData.setDiffAge(diff_ageDouble);

            try {
                SocketMsg socketMsg = new SocketMsg(JSONObject.toJSONString(resultData), MsgType.ZUI_JIA_WEI_ZHI);
                WebSocketServer.sendInfo(socketMsg, "nrj");
               // log.info("消息发送成功,【基站最佳位置信息】时间:" + DateUtil.formatNow());
            } catch (IOException e) {
                log.error("消息发送失败,【基站最佳位置信息】时间:" + DateUtil.formatNow());
                e.printStackTrace();
            }
        }
    }

    /**
     * 处理水平仪数据Data
     *
     * @param needData 串口数据
     * @param zhenTou  帧头
     */
    public static void chuLiChuanKouHorizontalData(String needData, String zhenTou) {
        if (StringUtils.isEmpty(needData)) {
            System.err.println("接收到串口数据为空！时间：" + DateUtil.formatNow());
            return;
        }
        // 获取处理完的串口数据
        List<String> contentList = chuanKouChuLiInit(needData, zhenTou);
        contentList.forEach(item -> {
            chuLiChuanKouHorizontalArr(item);
        });
    }

    /**
     * 处理移动测量点串口数据详细
     *
     * @param item
     */
    private static void chuLiChuanKouHorizontalArr(String item) {
        HangXiangDO resultData = new HangXiangDO();
        // 下标
        int index = 0;
        // 将当前十六进制数据用空格分隔成数组
        String[] sixteenArr = item.split(" ");
        // 获取当前数组长度：作为后期数据转换使用
        int arrLength = sixteenArr.length;
        // 从第四位开始：头长度 0x1C   HeaderLength 字节数 = 1
        String fourItem = sixteenArr[3];
        // 从第五位开始：MessageID Log 的信息 ID 字节数 = 2 （字节数等于2，所以截取第五六位,这里低字节在前高字节在后，所以反着拼接）
        String sixToFiveItem = sixteenArr[5] + sixteenArr[4];
        // 从第七位开始：Message Type：00 =二进制,01 = ASCII,10 = 简化 ASCII (本次使用00也就是二进制)
        String sevenItem = sixteenArr[6];
        // 判断是否为二进制
        if (!sevenItem.equals("00")) {
            return;
        }

        int fourItemToInt = Integer.parseInt(DigitalTrans.covert16Zhuan10(fourItem));
        index += fourItemToInt;

        // 类型判断：messageID；那个数据
        // sixToFiveItem
        // 解析：是否等于航向    MessageID ：971
        Integer sixToFiveItemToInt = Integer.parseInt(DigitalTrans.covert16Zhuan10(sixToFiveItem));
        // 解析：是否等于最佳位置  MessageID ：42
        if (sixToFiveItemToInt == 42) {
            // 位置类型 （字节数 = 4）
            index += 8;
            String posType = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4];
            int posTypeInt = Integer.parseInt(DigitalTrans.covert16Zhuan10(posType));
            resultData.setPosType(PosTypeEnum.getMsgByIndex(posTypeInt));
            // 维度（字节数 = 8）
            index += 8;
            String lat = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4] + sixteenArr[index - 5] + sixteenArr[index - 6] + sixteenArr[index - 7] + sixteenArr[index - 8];
            Long llat = Long.valueOf(lat, 16).longValue();
            double latDouble = Double.longBitsToDouble(llat);
            BigDecimal bigLat=new BigDecimal(latDouble);
            latDouble=bigLat.setScale(7,BigDecimal.ROUND_HALF_UP).doubleValue();
            resultData.setLat(latDouble);
            // 经度 （字节数 = 8）
            index += 8;
            String lon = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4] + sixteenArr[index - 5] + sixteenArr[index - 6] + sixteenArr[index - 7] + sixteenArr[index - 8];
            Long llon = Long.valueOf(lon, 16).longValue();
            double lonDouble = Double.longBitsToDouble(llon);
            BigDecimal bigLon=new BigDecimal(lonDouble);
            lonDouble=bigLon.setScale(7,BigDecimal.ROUND_HALF_UP).doubleValue();
            resultData.setLon(lonDouble);
            // 海拔高 （字节数 = 8）
            index += 8;
            String hgt = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4] + sixteenArr[index - 5] + sixteenArr[index - 6] + sixteenArr[index - 7] + sixteenArr[index - 8];
            Long lhgt = Long.valueOf(hgt, 16).longValue();
            double hgtDouble = Double.longBitsToDouble(lhgt);
            BigDecimal bigHgt=new BigDecimal(hgtDouble);
            hgtDouble=bigHgt.setScale(3,BigDecimal.ROUND_HALF_UP).doubleValue();
            resultData.setHgt(hgtDouble);
            try {
                SocketMsg socketMsg = new SocketMsg(JSONObject.toJSONString(resultData), MsgType.SHUI_PING_YI_ZUI_JIA_WEI_ZHI);
                WebSocketServer.sendInfo(socketMsg, "nrj");
               // log.info("消息发送成功,【水平测距仪最佳位置】时间:" + DateUtil.formatNow());
            } catch (IOException e) {
                log.error("消息发送失败,【水平测距仪最佳位置】时间:" + DateUtil.formatNow());
                e.printStackTrace();
            }
        }
    }

    /**
     * 处理双轴转台串口数据
     * 例如1：AA A5 55 04 03 FE FF 05 04 FE FF 00 03 02 FF FF 04 03 FF FF 05 04 FF FF 03 02 FF FF D3
     * 例如2：AA A5 55 04 03 02 00 05 04 03 00 00 03 02 00 00 04 03 00 00 05 04 00 00 03 02 00 00 D3
     *
     * @param needData 双轴转台串口数据
     * @param zhenTou  帧头
     */
    public static void chuliShuangZhouZhuanTaiData(String needData, String zhenTou) {
        if (StringUtils.isEmpty(needData)) {
            System.err.println("接收到串口数据为空！时间：" + DateUtil.formatNow());
            return;
        }
        // 获取处理完的串口数据
        List<String> contentList = chuanKouChuLiInit(needData, zhenTou);
        contentList.forEach(item -> {
            chuliShuangZhouZhuanTaiArr(item);
        });
    }

    private static void chuliShuangZhouZhuanTaiArr(String item) {
        // 分割十六进制数组
        String[] sixteenArr = item.split(" ");
        if (sixteenArr.length < 27) {
            return;
        }
        // 返回对象-发送数据VO
        ShuangZhouZhuanTaiVO resultData = new ShuangZhouZhuanTaiVO();
        double p1, p2;
        double tan1x, tan2x;
        double tan1y, tan2y;
        double x, y;
        double q1x, q1y;
        double q2x, q2y;
        double q1_jiajiao, q2_jiajiao;
        // 一万
        double tenThousand = 10000.0;
        double oneHundredAndEighty = 180.0;

        // x内环角度
        long xShiLiu = DigitalTrans.read16Data(sixteenArr[6], sixteenArr[5], sixteenArr[4], sixteenArr[3]);
        x = xShiLiu / tenThousand;
        resultData.setX(x);
        // y外环角度
        long yShiLiu = DigitalTrans.read16Data(sixteenArr[10], sixteenArr[9], sixteenArr[8], sixteenArr[7]);
        y = yShiLiu / tenThousand;
        resultData.setY(y);
        // 取出第十二位字符中的8位bit的第0位跟第4位
        int[] ints = DigitalTrans.read8Bit(sixteenArr[11]);
        resultData.setNhsn(ints[0]);
        resultData.setWhsn(ints[1]);
        // Q1x
        long q1xShiLiu = DigitalTrans.read16Data(sixteenArr[15], sixteenArr[14], sixteenArr[13], sixteenArr[12]);
        q1x = q1xShiLiu / tenThousand;
        resultData.setQ1x(q1x);
        // Q1y
        long q1yShiLiu = DigitalTrans.read16Data(sixteenArr[19], sixteenArr[18], sixteenArr[17], sixteenArr[16]);
        q1y = q1yShiLiu / tenThousand;
        resultData.setQ1y(q1y);
        // Q2x
        long q2xShiLiu = DigitalTrans.read16Data(sixteenArr[23], sixteenArr[22], sixteenArr[21], sixteenArr[20]);
        q2x = q2xShiLiu / tenThousand;
        resultData.setQ2x(q2x);
        // Q2y
        long q2yShiLiu = DigitalTrans.read16Data(sixteenArr[27], sixteenArr[26], sixteenArr[25], sixteenArr[24]);
        q2y = q2yShiLiu / tenThousand;
        resultData.setQ2y(q2y);
        // q1夹角
        tan1x = Math.tan(q1x * Math.PI / oneHundredAndEighty);
        tan1y = Math.tan(q1y * Math.PI / oneHundredAndEighty);
        p1 = tan1x * tan1x + tan1y * tan1y + tan1x * tan1x * tan1y * tan1y;
        BigDecimal q1JiaJiao = new BigDecimal(Math.atan(Math.sqrt(p1)) * oneHundredAndEighty / Math.PI);
        q1_jiajiao = q1JiaJiao.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
        resultData.setQ1JiaJiao(q1_jiajiao);
        // q2夹角
        tan2x = Math.tan(q2x * Math.PI / oneHundredAndEighty);
        tan2y = Math.tan(q2y * Math.PI / oneHundredAndEighty);
        p2 = tan2x * tan2x + tan2y * tan2y + tan2x * tan2x * tan2y * tan2y;
        BigDecimal q2JiaJiao = new BigDecimal(Math.atan(Math.sqrt(p2)) * oneHundredAndEighty / Math.PI);
        q2_jiajiao = q2JiaJiao.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
        resultData.setQ2JiaJiao(q2_jiajiao);
        // 夹角差
        BigDecimal bigDecimal = new BigDecimal(q1_jiajiao - q2_jiajiao);
        BigDecimal setScale = bigDecimal.setScale(4, BigDecimal.ROUND_HALF_UP);
        double jiaJiaoCha = Math.abs(setScale.doubleValue());
        resultData.setJiaJiaoCha(jiaJiaoCha);
        // x差
        BigDecimal bigDecimalX = new BigDecimal(q1x - q2x);
        BigDecimal setScaleX = bigDecimalX.setScale(4, BigDecimal.ROUND_HALF_UP);
        resultData.setQ1Cha(setScaleX.doubleValue());
        // y差
        BigDecimal bigDecimalY = new BigDecimal(q1y - q2y);
        BigDecimal setScaleY = bigDecimalY.setScale(4, BigDecimal.ROUND_HALF_UP);
        resultData.setQ2Cha(setScaleY.doubleValue());
        try {
            SocketMsg socketMsg = new SocketMsg(JSONObject.toJSONString(resultData), MsgType.SZ_ZT);
            WebSocketServer.sendInfo(socketMsg, "nrj");
            log.info("消息发送成功,【双轴转台】时间:" + DateUtil.formatNow());
        } catch (IOException e) {
            log.error("消息发送失败,【双轴转台】时间:" + DateUtil.formatNow());
            e.printStackTrace();
        }
    }

    /**
     * 处理无人机Data
     * @param needData
     * @param wuRenJiZhenTou
     */
    public static void chuliWuRenJiData(String needData, String wuRenJiZhenTou) {
        if (StringUtils.isEmpty(needData)) {
            System.err.println("处理【无人机】串口数据，接收到串口数据为空！时间：" + DateUtil.formatNow());
            return;
        }
        // 获取处理完的串口数据
        List<String> contentList = chuanKouChuLiInit(needData, wuRenJiZhenTou);
        contentList.forEach(item -> {
            chuLiChuanKouWuRenJiArr(item);
        });
    }

    /**
     * 处理无人机Arr数据
     * @param item 数据
     */
    private static void chuLiChuanKouWuRenJiArr(String item) {
        HangXiangDO resultData = new HangXiangDO();
        // 下标
        int index = 0;
        // 将当前十六进制数据用空格分隔成数组
        String[] sixteenArr = item.split(" ");
        // 获取当前数组长度：作为后期数据转换使用
        int arrLength = sixteenArr.length;
        // 从第四位开始：头长度 0x1C   HeaderLength 字节数 = 1
        String fourItem = sixteenArr[3];
        // 从第五位开始：MessageID Log 的信息 ID 字节数 = 2 （字节数等于2，所以截取第五六位,这里低字节在前高字节在后，所以反着拼接）
        String sixToFiveItem = sixteenArr[5] + sixteenArr[4];
        // 从第七位开始：Message Type：00 =二进制,01 = ASCII,10 = 简化 ASCII (本次使用00也就是二进制)
        String sevenItem = sixteenArr[6];
        // 判断是否为二进制
        if (!sevenItem.equals("00")) {
            return;
        }

        int fourItemToInt = Integer.parseInt(DigitalTrans.covert16Zhuan10(fourItem));
        index += fourItemToInt;

        // 类型判断：messageID；那个数据
        // sixToFiveItem
        // 解析：是否等于航向    MessageID ：971
        Integer sixToFiveItemToInt = Integer.parseInt(DigitalTrans.covert16Zhuan10(sixToFiveItem));
        // 解析：是否等于最佳位置  MessageID ：42
        if (sixToFiveItemToInt == 42) {
            // 位置类型 （字节数 = 4）
            index += 8;
            String posType = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4];
            int posTypeInt = Integer.parseInt(DigitalTrans.covert16Zhuan10(posType));
            resultData.setPosType(PosTypeEnum.getMsgByIndex(posTypeInt));
            // 纬度（字节数 = 8）
            index += 8;
            String lat = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4] + sixteenArr[index - 5] + sixteenArr[index - 6] + sixteenArr[index - 7] + sixteenArr[index - 8];
            Long llat = Long.valueOf(lat, 16).longValue();
            double latDouble = Double.longBitsToDouble(llat);
            BigDecimal bigLat=new BigDecimal(latDouble);
            latDouble=bigLat.setScale(7,BigDecimal.ROUND_HALF_UP).doubleValue();
            resultData.setLat(latDouble);
            // 经度 （字节数 = 8）
            index += 8;
            String lon = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4] + sixteenArr[index - 5] + sixteenArr[index - 6] + sixteenArr[index - 7] + sixteenArr[index - 8];
            Long llon = Long.valueOf(lon, 16).longValue();
            double lonDouble = Double.longBitsToDouble(llon);
            BigDecimal bigLon=new BigDecimal(lonDouble);
            lonDouble=bigLon.setScale(7,BigDecimal.ROUND_HALF_UP).doubleValue();
            resultData.setLon(lonDouble);
            // 海拔高 （字节数 = 8）
            index += 8;
            String hgt = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4] + sixteenArr[index - 5] + sixteenArr[index - 6] + sixteenArr[index - 7] + sixteenArr[index - 8];
            Long lhgt = Long.valueOf(hgt, 16).longValue();
            double hgtDouble = Double.longBitsToDouble(lhgt);
            BigDecimal bigHgt=new BigDecimal(hgtDouble);
            hgtDouble=bigHgt.setScale(3,BigDecimal.ROUND_HALF_UP).doubleValue();
            resultData.setHgt(hgtDouble);
            try {
                SocketMsg socketMsg = new SocketMsg(JSONObject.toJSONString(resultData), MsgType.WU_REN_JI_BI_HE_TONG_LU);
                WebSocketServer.sendInfo(socketMsg, "nrj");
                //log.info("消息发送成功,【无人机闭合通路】时间:" + DateUtil.formatNow());
            } catch (IOException e) {
                log.error("消息发送失败,【无人机闭合通路】时间:" + DateUtil.formatNow());
                e.printStackTrace();
            }
        }
    }
}
